/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package br.gov.fasepa.sgpf.util;

import br.gov.fasepa.sgpf.entity.Servidor;
import br.gov.fasepa.sgpf.entity.Setor;
import br.gov.fasepa.sgpf.entity.Subsetor;
import br.gov.fasepa.sgpf.entity.Unidade;
import br.gov.fasepa.sgpf.rn.ServidorRN;
import br.gov.fasepa.sgpf.rn.SetorRN;
import br.gov.fasepa.sgpf.rn.SubsetorRN;
import br.gov.fasepa.sgpf.rn.UnidadeRN;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.InputMismatchException;
import java.util.List;
import java.util.Objects;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 *
 * @author marcosdj
 */
public class Validator {

    /**
     * Método que verifica se o cnpj é válido, espera-se uma String
     *
     * @param cnpj
     * @return
     */
    public boolean validCNPJ(String cnpj) {
        if (cnpj == null
                || cnpj.equals("00000000000000")
                || cnpj.equals("11111111111111")
                || cnpj.equals("22222222222222")
                || cnpj.equals("33333333333333")
                || cnpj.equals("44444444444444")
                || cnpj.equals("55555555555555")
                || cnpj.equals("66666666666666")
                || cnpj.equals("77777777777777")
                || cnpj.equals("88888888888888")
                || cnpj.equals("99999999999999")
                || cnpj.length() != 14) {
            return false;
        }

        try {
            Long.parseLong(cnpj);
        } catch (NumberFormatException e) {
            return false;
        }

        int soma = 0;
        String cnpj_calc = cnpj.substring(0, 12);

        char chr_cnpj[] = cnpj.toCharArray();
        for (int i = 0; i < 4; i++) {
            if (chr_cnpj[i] - 48 >= 0 && chr_cnpj[i] - 48 <= 9) {
                soma += (chr_cnpj[i] - 48) * (6 - (i + 1));
            }
        }

        for (int i = 0; i < 8; i++) {
            if (chr_cnpj[i + 4] - 48 >= 0 && chr_cnpj[i + 4] - 48 <= 9) {
                soma += (chr_cnpj[i + 4] - 48) * (10 - (i + 1));
            }
        }

        int dig = 11 - soma % 11;
        cnpj_calc = (new StringBuilder(String.valueOf(cnpj_calc))).append(dig != 10 && dig != 11 ? Integer.toString(dig) : "0").toString();
        soma = 0;
        for (int i = 0; i < 5; i++) {
            if (chr_cnpj[i] - 48 >= 0 && chr_cnpj[i] - 48 <= 9) {
                soma += (chr_cnpj[i] - 48) * (7 - (i + 1));
            }
        }

        for (int i = 0; i < 8; i++) {
            if (chr_cnpj[i + 5] - 48 >= 0 && chr_cnpj[i + 5] - 48 <= 9) {
                soma += (chr_cnpj[i + 5] - 48) * (10 - (i + 1));
            }
        }

        dig = 11 - soma % 11;
        cnpj_calc = (new StringBuilder(String.valueOf(cnpj_calc))).append(dig != 10 && dig != 11 ? Integer.toString(dig) : "0").toString();

        return cnpj.equals(cnpj_calc);
    }

    public boolean validCPF(String CPF) {
// considera-se erro CPF's formados por uma sequencia de numeros iguais
        if (CPF.equals("00000000000") || CPF.equals("11111111111")
                || CPF.equals("22222222222") || CPF.equals("33333333333")
                || CPF.equals("44444444444") || CPF.equals("55555555555")
                || CPF.equals("66666666666") || CPF.equals("77777777777")
                || CPF.equals("88888888888") || CPF.equals("99999999999")
                || (CPF.length() != 11)) {
            return (false);
        }

        char dig10, dig11;
        int sm, i, r, num, peso;

// "try" - protege o codigo para eventuais erros de conversao de tipo (int)
        try {
// Calculo do 1o. Digito Verificador
            sm = 0;
            peso = 10;
            for (i = 0; i < 9; i++) {
// converte o i-esimo caractere do CPF em um numero:
// por exemplo, transforma o caractere '0' no inteiro 0         
// (48 eh a posicao de '0' na tabela ASCII)         
                num = (int) (CPF.charAt(i) - 48);
                sm = sm + (num * peso);
                peso = peso - 1;
            }

            r = 11 - (sm % 11);
            if ((r == 10) || (r == 11)) {
                dig10 = '0';
            } else {
                dig10 = (char) (r + 48); // converte no respectivo caractere numerico
            }
// Calculo do 2o. Digito Verificador
            sm = 0;
            peso = 11;
            for (i = 0; i < 10; i++) {
                num = (int) (CPF.charAt(i) - 48);
                sm = sm + (num * peso);
                peso = peso - 1;
            }

            r = 11 - (sm % 11);
            if ((r == 10) || (r == 11)) {
                dig11 = '0';
            } else {
                dig11 = (char) (r + 48);
            }

// Verifica se os digitos calculados conferem com os digitos informados.
            if ((dig10 == CPF.charAt(9)) && (dig11 == CPF.charAt(10))) {
                return (true);
            } else {
                return (false);
            }
        } catch (InputMismatchException erro) {
            return (false);
        }
    }

    public boolean validatePIS(String plPIS) {

        int liTamanho = 0;
        StringBuffer lsAux = null;
        StringBuffer lsMultiplicador = new StringBuffer("3298765432");
        int liTotalizador = 0;
        int liResto = 0;
        int liMultiplicando = 0;
        int liMultiplicador = 0;
        boolean lbRetorno = true;
        int liDigito = 99;

        lsAux = new StringBuffer().append(plPIS);
        liTamanho = lsAux.length();

        if (liTamanho != 11) {
            lbRetorno = false;
        }

        if (lbRetorno) {
            for (int i = 0; i < 10; i++) {

                liMultiplicando = Integer.parseInt(lsAux.substring(i, i + 1));
                liMultiplicador = Integer.parseInt(lsMultiplicador.substring(i, i + 1));
                liTotalizador += liMultiplicando * liMultiplicador;
            }

            liResto = 11 - liTotalizador % 11;
            liResto = liResto == 10 || liResto == 11 ? 0 : liResto;

            liDigito = Integer.parseInt("" + lsAux.charAt(10));
            lbRetorno = liResto == liDigito;
        }

        return lbRetorno;
    }

    /**
     * Método que verifica se a data é válido, espera-se uma String no formato
     * yyyy-mm-dd a validação ocorre transformando a string em um Date do java.
     *
     * @param date
     * @return
     */
    public boolean validateDate(String date) {

        boolean verify = true;

        try {
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-mm-dd");
            Date convertedDate = dateFormat.parse(date);
        } catch (Exception e) {
            verify = false;
        }

        return verify;

    }

    public void verificaSessao() {
        if (JsfUtil.getSession().getAttribute("UC") != null) {
            SystemUtil.updateUseCase(null, null);
            SystemUtil.removeAtribute();
        }
    }

    /**
     * Validador de CPF
     *
     * @param cpf
     * @return
     */
    public boolean validateCPF(String cpf) {

        boolean ret = false;
        String base = "000000000";
        String digitos = "00";
        if (cpf.length() <= 11) {
            if (cpf.length() < 11) {
                cpf = base.substring(0, 11 - cpf.length()) + cpf;
                base = cpf.substring(0, 9);
            }
            base = cpf.substring(0, 9);
            digitos = cpf.substring(9, 11);
            int soma = 0, mult = 11;
            int[] var = new int[11];
            // Recebe os números e realiza a multiplicação e soma.  
            for (int i = 0; i < 9; i++) {
                var[i] = Integer.parseInt("" + cpf.charAt(i));
                if (i < 9) {
                    soma += (var[i] * --mult);
                }
            }
            // Cria o primeiro dígito verificador.  
            int resto = soma % 11;
            if (resto < 2) {
                var[9] = 0;
            } else {
                var[9] = 11 - resto;
            }
            // Reinicia os valores.  
            soma = 0;
            mult = 11;
            // Realiza a multiplicação e soma do segundo dígito.  
            for (int i = 0; i < 10; i++) {
                soma += var[i] * mult--;
            }
            // Cria o segundo dígito verificador.  
            resto = soma % 11;
            if (resto < 2) {
                var[10] = 0;
            } else {
                var[10] = 11 - resto;
            }
            if ((digitos.substring(0, 1).equalsIgnoreCase(new Integer(var[9])
                    .toString()))
                    && (digitos.substring(1, 2).equalsIgnoreCase(new Integer(
                                    var[10]).toString()))) {
                ret = true;
            }
        }

        return ret;
    }

    public boolean validEmail(String email) {
        Pattern p = Pattern.compile("^[\\w-]+(\\.[\\w-]+)*@([\\w-]+\\.)+[a-zA-Z]{2,7}$");
        Matcher m = p.matcher(email);
        if (m.find()) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * Método que indetifica se a data informada esta dentro do range desejado
     *
     * @param date
     * @return
     */
    public boolean verifyDateByRanger(Date date) {
        String datePattern = "dd/MM/yyyy";

        SimpleDateFormat sdf = new SimpleDateFormat(datePattern);
        sdf.setLenient(false);

        try {
            //Menor data aceita pelo SQLServer 2008 R2 01/01/1753 
            //A data mínima utilizado pelos sistemas internos é 01/01/1998
            Date lowestDate = sdf.parse("01/01/1998 00:00");
            if (date.before(lowestDate)) {
                return true;
            } else {
                return false;
            }

        } catch (Exception e) {
            //TODO
            return true;
        }
    }

    public boolean iscpfCadastrado(String cnpj) {
        String temp = cnpj.replaceAll("[/.-]", "");
        boolean resposta = false;
        List<Servidor> todos = new ServidorRN().obtainAll(Servidor.class);
        for (Servidor si : todos) {
            if (si.getCpf().replaceAll("[/.-]", "").equals(temp)) {
                resposta = true;
                break;
            } else {
                resposta = false;
            }
        }
        return resposta;
    }

    public boolean isPisCadastrado(String pis) {
        String temp = pis.replaceAll("[/.-]", "");
        boolean resposta = false;
        List<Servidor> todos = new ServidorRN().obtainAll(Servidor.class);
        for (Servidor si : todos) {
            if (si.getPisPasep().replaceAll("[/.-]", "").equals(temp)) {
                resposta = true;
                break;
            } else {
                resposta = false;
            }
        }
        return resposta;
    }

    public boolean isTituloCadastrado(String titulo) {
        String temp = titulo.replaceAll("[/.-]", "");
        boolean resposta = false;
        List<Servidor> todos = new ServidorRN().obtainAll(Servidor.class);
        for (Servidor si : todos) {
            if (si.getTitulo().replaceAll("[/.-]", "").equals(temp)) {
                resposta = true;
                break;
            } else {
                resposta = false;
            }
        }
        return resposta;
    }

    public boolean isRGCadastrado(String rg) {
        String temp = rg.replaceAll("[/.-]", "");
        boolean resposta = false;
        List<Servidor> todos = new ServidorRN().obtainAll(Servidor.class);
        for (Servidor si : todos) {
            if (si.getRg().replaceAll("[/.-]", "").equals(temp)) {
                resposta = true;
                break;
            } else {
                resposta = false;
            }
        }
        return resposta;
    }

    public boolean isResponsavel(Servidor s) {
        boolean resposta = false;
        List<Unidade> unidades = new UnidadeRN().obtainAll(Unidade.class);
        List<Setor> setores = new SetorRN().obtainAll(Setor.class);
        List<Subsetor> subsetores = new SubsetorRN().obtainAll(Subsetor.class);
        if (unidades != null) {
            for (Unidade unidade : unidades) {
                if (Objects.equals(unidade.getResponsavel().getId(), s.getId())) {
                    resposta = true;
                    break;
                }
            }
        }
        if (setores != null) {
            for (Setor setor : setores) {
                if (Objects.equals(setor.getResponsavel().getId(), s.getId())) {
                    resposta = true;
                    break;
                }
            }
        }
        if (subsetores != null) {
            for (Subsetor subsetor : subsetores) {
                if (Objects.equals(subsetor.getResponsavel().getId(), s.getId())) {
                    resposta = true;
                    break;
                }
            }
        }
        return resposta;
    }
    
}
